package com.rybbaby.tss.platform.initializer;

import com.rybbaby.tss.core.initializer.AbstractAutomaticInit;
import com.rybbaby.tss.core.utils.SpringApplicationContextUtil;
import com.rybbaby.tss.platform.sysConfig.entity.SysConfig;
import com.rybbaby.tss.platform.sysConfig.service.ISysConfigService;
import com.rybbaby.tss.platform.sysConfigGroup.entity.SysConfigGroup;
import com.rybbaby.tss.platform.sysConfigGroup.service.ISysConfigGroupService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description 系统操作参数初始化器
 * 
 * @author 谢进伟
 * 
 * @createDate 2016年11月26日 上午10:27:56
 */
public class SysConfigInitializer extends AbstractAutomaticInit {
	
	/** 所有参数分组 **/
	private static List<SysConfigGroup> allGroup;
	/** 所有参数配置 **/
	private static List<SysConfig> allConfigList;
	/** 以分组名为key的映射 **/
	private static Map<String , List<SysConfig>> groupMap = new HashMap<String , List<SysConfig>>();
	/** 以分参数名为key的映射 **/
	private static Map<String , SysConfig> configNameMap = new HashMap<String , SysConfig>();
	
	@Override
	public void autoInit() {
		load();
	}
	
	/**
	 * 加载所有系统配置参数
	 */
	public static void load() {
		ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
		cachedThreadPool.execute(new Runnable(){

			@Override
			public void run() {
				allConfigList = SpringApplicationContextUtil.getContext().getBean(ISysConfigService.class).loadAll();
				allGroup = SpringApplicationContextUtil.getContext().getBean(ISysConfigGroupService.class).loadAll();
				if(allConfigList != null && !allConfigList.isEmpty()) {
					groupMap.clear();
					for(SysConfig sysConfig : allConfigList) {
						configNameMap.put(sysConfig.getName() , sysConfig);
					}
				}
				if(allGroup != null && !allGroup.isEmpty()) {
					groupMap.clear();
					for(SysConfigGroup group : allGroup) {
						for(SysConfig sysConfig : allConfigList) {
							if(sysConfig.getGroupId().equals(group.getId())) {
								String key = group.getGroupName();
								if(groupMap.containsKey(key)) {
									groupMap.get(key).add(sysConfig);
								} else {
									List<SysConfig> list = new ArrayList<SysConfig>();
									list.add(sysConfig);
									groupMap.put(key , list);
								}
							}
						}
					}
				}
			}
			
		});
		cachedThreadPool.shutdown();
	}
	
	/**
	 * @return 以分组名为key的映射
	 */
	public static Map<String , List<SysConfig>> getGroupMap() {
		return groupMap;
	}
	
	/**
	 * @return 以分参数名为key的映射
	 */
	public static Map<String , SysConfig> getConfigNameMap() {
		return configNameMap;
	}
	
	/**
	 * @return 获取所有系统参数配置信息
	 */
	public static List<SysConfig> getAllConfigList() {
		return allConfigList;
	}
	
	/**
	 * 获取指定分组下的所有配置
	 * 
	 * @param groupName
	 *            分组名
	 * @return
	 */
	public static List<SysConfig> getConfigByGroupName(String groupName) {
		return groupMap.get(groupName);
	}
	
	/**
	 * 获取指定参数名对应的参数值
	 * 
	 * @param configName
	 *            参数名
	 * @return
	 */
	public static SysConfig getConfigByConfigName(String configName) {
		return configNameMap.get(configName);
	}
	
	/**
	 * 获取指定参数名对应的参数值
	 * 
	 * @param configName
	 *            参数名
	 * @param defaultValue
	 *            如果没有找到配置参数时使用的默认值
	 * @return
	 */
	public static Object getConfigValueByConfigName(String configName , Object defaultValue) {
		SysConfig configValue = configNameMap.get(configName);
		if(configValue == null) {
			return defaultValue;
		} else {
			return configValue.getValue();
		}
	}
}
